// 版权归Epic Games, Inc.所有。保留所有权利。

#include "IndicatorLayer.h"

#include "SActorCanvas.h"
#include "Widgets/Layout/SBox.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(IndicatorLayer)

class SWidget;

/////////////////////////////////////////////////////
// UIndicatorLayer

/**
 * 构造函数
 * @param ObjectInitializer 对象初始化器
 */
UIndicatorLayer::UIndicatorLayer(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
	bIsVariable = true; // 设置为变量
	SetVisibility(ESlateVisibility::HitTestInvisible); // 设置可见性为命中测试不可见
}

/**
 * 释放Slate资源
 * @param bReleaseChildren 是否释放子资源
 */
void UIndicatorLayer::ReleaseSlateResources(bool bReleaseChildren)
{
	Super::ReleaseSlateResources(bReleaseChildren); // 调用父类释放资源

	MyActorCanvas.Reset(); // 重置我的角色画布
}

/**
 * 重新构建小部件
 * @return 构建的小部件共享引用
 */
TSharedRef<SWidget> UIndicatorLayer::RebuildWidget()
{
	// 如果不是设计时
	if (!IsDesignTime())
	{
		ULocalPlayer* LocalPlayer = GetOwningLocalPlayer(); // 获取本地玩家
		// 确保本地玩家有效
		if (ensureMsgf(LocalPlayer, TEXT("尝试在没有有效本地玩家的情况下重新构建UActorCanvas！")))
		{
			// 创建新的SActorCanvas
			MyActorCanvas = SNew(SActorCanvas, FLocalPlayerContext(LocalPlayer), &ArrowBrush);
			return MyActorCanvas.ToSharedRef(); // 返回共享引用
		}
	}

	// 给它一个简单的盒子，NullWidget从UWidget使用不安全
	return SNew(SBox); // 返回SBox
}